"""
Django项目'backend'的设置文件。

由Django 5.1.7版本的'django-admin startproject'命令生成。

更多信息请参考:
https://docs.djangoproject.com/en/5.1/topics/settings/

完整的设置列表及其值请参考:
https://docs.djangoproject.com/en/5.1/ref/settings/
"""

# 导入所需的Python标准库
import os  # 用于操作系统相关功能
from pathlib import Path  # 用于处理文件路径

# 构建项目根目录的路径
# __file__是当前文件的路径,resolve()解析符号链接,parent.parent获取上两级目录
BASE_DIR = Path(__file__).resolve().parent.parent


# 快速启动开发设置 - 不适用于生产环境
# 参考 https://docs.djangoproject.com/en/5.1/howto/deployment/checklist/

# 安全警告: 在生产环境中保持密钥的机密性!
SECRET_KEY = 'django-insecure-your-secret-key-here'  # Django的密钥,用于加密

# 安全警告: 不要在生产环境中启用调试模式!
DEBUG = True  # 开启调试模式

ALLOWED_HOSTS = []  # 允许访问的主机列表,空列表表示只允许localhost


# 应用程序定义

INSTALLED_APPS = [
    'django.contrib.admin',  # Django管理后台
    'django.contrib.auth',   # 认证系统
    'django.contrib.contenttypes',  # 内容类型框架
    'django.contrib.sessions',  # 会话框架
    'django.contrib.messages',  # 消息框架
    'django.contrib.staticfiles',  # 静态文件管理
    'rest_framework',  # REST框架
    'corsheaders',  # 处理跨域资源共享
    'documents',  # 文档应用
    'accounts',  # 账户应用
    'parser',  # 文档解析应用
    'exercises',  # 练习题系统应用
]

# 中间件配置
MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',  # 安全中间件
    'django.contrib.sessions.middleware.SessionMiddleware',  # 会话中间件
    'corsheaders.middleware.CorsMiddleware',  # CORS中间件
    'django.middleware.common.CommonMiddleware',  # 通用中间件
    'django.middleware.csrf.CsrfViewMiddleware',  # CSRF保护
    'django.contrib.auth.middleware.AuthenticationMiddleware',  # 认证中间件
    'django.contrib.messages.middleware.MessageMiddleware',  # 消息中间件
    'django.middleware.clickjacking.XFrameOptionsMiddleware',  # 点击劫持保护
]

ROOT_URLCONF = 'backend.urls'  # 根URL配置

# 模板配置
TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',  # 模板引擎
        'DIRS': [],  # 模板目录列表
        'APP_DIRS': True,  # 是否在应用中查找模板
        'OPTIONS': {  # 模板选项
            'context_processors': [  # 上下文处理器
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
            ],
        },
    },
]

# WSGI应用配置
WSGI_APPLICATION = 'backend.wsgi.application'


# 数据库配置
# https://docs.djangoproject.com/en/5.1/ref/settings/#databases

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',  # 使用SQLite数据库
        'NAME': BASE_DIR / 'db.sqlite3',  # 数据库文件路径
    }
}


# 密码验证配置
# https://docs.djangoproject.com/en/5.1/ref/settings/#auth-password-validators

AUTH_PASSWORD_VALIDATORS = [
    {
        'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator',  # 检查密码与用户属性的相似性
    },
    {
        'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator',  # 检查密码最小长度
        'OPTIONS': {
            'min_length': 8,  # 密码最小长度为8
        }
    },
    {
        'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator',  # 检查常用密码
    },
    {
        'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator',  # 检查纯数字密码
    },
]


# 国际化配置
# https://docs.djangoproject.com/en/5.1/topics/i18n/

LANGUAGE_CODE = 'zh-hans'  # 使用简体中文

TIME_ZONE = 'Asia/Shanghai'  # 使用上海时区

USE_I18N = True  # 启用国际化

USE_TZ = True  # 启用时区支持


# 静态文件配置 (CSS, JavaScript, Images)
# https://docs.djangoproject.com/en/5.1/howto/static-files/

STATIC_URL = 'static/'  # 静态文件URL前缀
STATIC_ROOT = os.path.join(BASE_DIR, 'static')  # 静态文件根目录

MEDIA_URL = '/media/'  # 媒体文件URL前缀
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')  # 媒体文件根目录

# 确保媒体目录存在
os.makedirs(MEDIA_ROOT, exist_ok=True)

# 默认主键字段类型
DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField'  # 使用64位整数作为主键

# 文件上传设置
DATA_UPLOAD_MAX_MEMORY_SIZE = 2147483648  # 数据上传最大内存大小(2GB)
FILE_UPLOAD_MAX_MEMORY_SIZE = 2147483648  # 文件上传最大内存大小(2GB)
FILE_UPLOAD_PERMISSIONS = 0o644  # 上传文件权限
FILE_UPLOAD_DIRECTORY_PERMISSIONS = 0o755  # 上传目录权限
FILE_UPLOAD_HANDLERS = [  # 文件上传处理器
    'django.core.files.uploadhandler.MemoryFileUploadHandler',  # 内存上传处理器
    'django.core.files.uploadhandler.TemporaryFileUploadHandler',  # 临时文件上传处理器
]
# 增加大文件上传超时时间
DATA_UPLOAD_MAX_NUMBER_FIELDS = 10240  # 最大字段数
TIMEOUT = 300  # 超时时间5分钟

# CORS(跨域资源共享)设置
CORS_ALLOW_ALL_ORIGINS = True  # 允许所有来源
CORS_ALLOW_CREDENTIALS = True  # 允许携带认证信息
CORS_ALLOWED_ORIGINS = [  # 允许的源
    "http://localhost:5173",
    "http://127.0.0.1:5173",
]
CORS_ALLOW_METHODS = [  # 允许的HTTP方法
    'DELETE',
    'GET',
    'OPTIONS',
    'PATCH',
    'POST',
    'PUT',
]
CORS_ALLOW_HEADERS = [  # 允许的HTTP头
    'accept',
    'accept-encoding',
    'authorization',
    'content-type',
    'dnt',
    'origin',
    'user-agent',
    'x-csrftoken',
    'x-requested-with',
]

# REST Framework设置
REST_FRAMEWORK = {
    'DEFAULT_AUTHENTICATION_CLASSES': [  # 默认认证类
        'rest_framework_simplejwt.authentication.JWTAuthentication',  # JWT认证
        'rest_framework.authentication.SessionAuthentication',  # 会话认证
    ],
    'DEFAULT_PERMISSION_CLASSES': [  # 默认权限类
        'rest_framework.permissions.IsAuthenticated',  # 要求认证
    ],
    'DEFAULT_RENDERER_CLASSES': [  # 默认渲染器
        'rest_framework.renderers.JSONRenderer',  # JSON渲染器
        'rest_framework.renderers.BrowsableAPIRenderer',  # 可浏览API渲染器
    ],
}

# JWT设置
from datetime import timedelta
SIMPLE_JWT = {
    'ACCESS_TOKEN_LIFETIME': timedelta(days=1),  # 访问令牌有效期1天
    'REFRESH_TOKEN_LIFETIME': timedelta(days=7),  # 刷新令牌有效期7天
    'ROTATE_REFRESH_TOKENS': True,  # 刷新令牌时轮换
    'AUTH_HEADER_TYPES': ('Bearer',),  # 认证头类型
    'AUTH_HEADER_NAME': 'HTTP_AUTHORIZATION',  # 认证头名称
    'USER_ID_FIELD': 'id',  # 用户ID字段
    'USER_ID_CLAIM': 'user_id',  # 用户ID声明
    'AUTH_TOKEN_CLASSES': ('rest_framework_simplejwt.tokens.AccessToken',),  # 令牌类
}

# 自定义用户模型
AUTH_USER_MODEL = 'accounts.User'  # 使用自定义用户模型

# 日志配置
LOGGING = {
    'version': 1,
    'disable_existing_loggers': False,  # 不禁用现有的日志器
    'formatters': {  # 日志格式器
        'verbose': {
            'format': '{levelname} {asctime} {module} {message}',  # 详细格式
            'style': '{',
        },
    },
    'handlers': {  # 日志处理器
        'console': {  # 控制台处理器
            'class': 'logging.StreamHandler',
            'formatter': 'verbose',
        },
        'file': {  # 文件处理器
            'class': 'logging.FileHandler',
            'filename': os.path.join(BASE_DIR, 'debug.log'),  # 日志文件路径
            'formatter': 'verbose',
        },
    },
    'loggers': {  # 日志记录器
        'documents': {  # documents应用的日志
            'handlers': ['console', 'file'],  # 使用控制台和文件处理器
            'level': 'DEBUG',  # 日志级别为DEBUG
            'propagate': True,  # 允许传播到父级记录器
        },
    },
}
